package com.atguigu.java2;

import com.atguigu.java1.Person;
import org.junit.Test;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
 * @author yihu
 * @create 2021-06-16 17:39
 * @email:1057202547@qq.com
 * @dec: 获取运行时类的方法结构
 */
public class MethodTest {
    @Test
    public  void test(){
        Class<Person> clazz = Person.class;
        //getMethods():获取当前运行时类及其所有父类中声明为public权限的方法
        Method[] methods = clazz.getMethods();
        for (Method m :methods){
            System.out.println(m);
        }
        System.out.println("----------------------------------------------");
        //getDeclaredMethods():获取当前运行时类中声明的所有方法。（不包含父类中声明的方法）
        Method[] declaredMethods = clazz.getDeclaredMethods();
        for(Method m : declaredMethods){
            System.out.println(m);
        }
    }
    //方法结构 ：权限修饰符  返回值类型 方法名（参数类型。。。） throws xxxException{}
    @Test
    public  void test2(){
        Class<Person> clazz = Person.class;
        Method[] declaredMethods = clazz.getDeclaredMethods();
        for(Method m : declaredMethods){
            //1 获取方法注解
            Annotation[] annotations = m.getAnnotations();
            for (Annotation a:annotations){
                System.out.println(a);
            }
            //2 获取权限修饰符
            System.out.print(Modifier.toString(m.getModifiers()) + "\t");
            //3 获取返回值类型
            System.out.print(m.getReturnType().getName() + "\t");
            //4.获取方法名
            System.out.print(m.getName());
            System.out.print("(");
            //5.获取形参列表
            Class[] parameterTypes = m.getParameterTypes();
            if(!(parameterTypes == null && parameterTypes.length == 0)){
                for(int i = 0;i < parameterTypes.length;i++){
                    if(i == parameterTypes.length - 1){
                        System.out.print(parameterTypes[i].getName() + " args_" + i);
                        break;
                    }
                    System.out.print(parameterTypes[i].getName() + " args_" + i + ",");
                }
            }
            System.out.print(")");
            //6.获取抛出的异常
            Class<?>[] exceptionTypes = m.getExceptionTypes();
            if(exceptionTypes.length > 0){
                System.out.print("throws ");
                for (int i = 0;i < exceptionTypes.length;i++){
                    if(i == parameterTypes.length - 1){
                        System.out.print(exceptionTypes[i].getName() );
                        break;
                    }
                    System.out.print(exceptionTypes[i].getName() + ",");
                }
            }
        }
    }
}
